CocoaPods 大全

[TOC]

一、CocoaPods 简介

CocoaPods 是一个用 Ruby 写的、负责管理iOS项目中第三方开源库的工具,CocoaPods 能让我们集中的、统一管理第三方开源库,为我们节省设置和更新第三方开源库的时间。

二、CocoaPods 安装

下面就正式开始安装 CocoaPods,命令中间可能有空格看不出来,建议直接复制粘贴执行;

因为 Mac 电脑自带 Ruby 环境,我们就只需打开终端开始动手。然而又因为默认情况下我们 MacOS 系统自带的 Ruby 环境版本比较低(大概是 2.0.0 或者其他较高版本),但是现在安装 CocoaPods 需要 2.2.2 版本及以上的,所以我们不管三七二十一先直接先升级 Ruby。

1、查看当前Ruby版本
1
$ ruby -v
2、升级Ruby环境,首先需要安装rvm(第一步要下载一些东西等两分钟左右)
1
2
3
4
5
$ curl -L get.rvm.io | bash -s stable 

$ source ~/.bashrc

$ source ~/.bash_profile
3、查看rvm版本
1
$ rvm -v

显示如下(或者是其他版本)

1
rvm 1.29.3 (latest) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io]
4、列出ruby可安装的版本信息
1
$ rvm list known

显示如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p648]
[ruby-]2.1[.10]
[ruby-]2.2[.10]
[ruby-]2.3[.7]
[ruby-]2.4[.4]
[ruby-]2.5[.1] // 重点在这里 重点在这里 重点在这里
[ruby-]2.6[.0-preview2] // 测试版
ruby-head
.....
5、安装一个ruby版本(这里我选择的是2.5.1版本,当然你也可以选择其他的)
1
2
3
$ rvm install 2.5.1
# 注意:安装过程中需要两次按下 Enter 键, 第二次按下后需要输入电脑访问密码(不可见, 只管输入就行);
# 如果你电脑没有安装 Xcode 和 Command Line Tools for Xcode 以及 Homebrew 会自动下载安装, 建议提前安装这三者.
6、设置为默认版本
1
$ rvm use 2.5.1 --default
7、更换源
1
2
3
4
5
$ sudo gem update --system

$ gem sources --remove https://rubygems.org/

$ gem sources --add https://gems.ruby-china.org/
1
2
3
4
5
6
> 更换流程:
> 1、删除原有的镜像源:$ gem sources --remove https://gems.ruby-china.org/
> 2、添加最新的镜像源:$ gem sources --add https://gems.ruby-china.com/
> 3、查看镜像源:$ gem sources -l
> 确保只有 https://gems.ruby-china.com/
>
8、为了验证你的Ruby镜像是并且仅是ruby-china,执行以下命令查看
1
$ gem sources -l

如果是以下结果说明正确,如果有其他的请自行百度解决

1
2
3
*** CURRENT SOURCES ***

https://gems.ruby-china.com/
9、这时候才正式开始安装CocoaPods
1
$ sudo gem install cocoapods # Mac OS X 10.11前 输入这一条
1
$ sudo gem install -n /usr/local/bin cocoapods # Mac OS X 10.11后 输入这一条

使用如下命令查看 CocoaPods 版本:

1
2
3
4
5
6
7
8
9
10
$ gem list --local | grep cocoapods
cocoapods (1.3.1)
cocoapods-core (1.3.1)
cocoapods-deintegrate (1.0.1)
cocoapods-downloader (1.1.3)
cocoapods-plugins (1.0.0)
cocoapods-search (1.0.0)
cocoapods-stats (1.0.0)
cocoapods-trunk (1.3.0)
cocoapods-try (1.1.0)

可以看到cocoapods版本为1.3.1,同时也可以看到其它部分版本。

默认安装的CocoaPods为正式版,使用gem install cocoapods --pre命令安装测试版CocoaPods,使用gem install cocoapods -v x.y.z 命令安装指定版本CocoaPods。

10、如果安装了多个Xcode使用下面的命令选择(一般需要选择最近的Xcode版本)
1
$ sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
11、安装本地库
1
$ pod setup
12、执行以上命令后
1
2
3
4
5
6
Setting up CocoaPods master repo
$ /usr/bin/git clone https://github.com/CocoaPods/Specs.git master --progress
Cloning into 'master'...
remote: Counting objects: 1879515, done.
remote: Compressing objects: 100% (321/321), done.
Receiving objects: 21% (404525/1879515), 73.70 MiB | 22.00 KiB/

然后就是漫长的等待,当然,网络好的情况下会更快

以下一段忽略,直接看 第 13 步:

要查看文件下载进度的可以另外打开一个终端窗口(快捷键:选中终端按下 Command+N 组合键),输入以下两行命令回车执行

1
2
3
$ cd ~/.cocoapods

$ du -sh *

执行 du -sh * 之后会显示已下载的文件大小,可以多次执行来监看下载进度,如果之前还有文件大小,后来变成0了,可能是网络问题,下载已经中断了,需要结束命令并从新执行 pod setup

13、下载安装完成之后可执行下列命令检查是否可用(第一次使用可能要等一会)
1
$ pod search AFNetworking

三、创建 Pod 库

1、创建pod步骤如下:
  1. 使用 pod lib create NAME 命令为pod创建目录结构和相关模版文件。
  2. 更新 pod 的元数据(metadata),如版本信息、source、license 等。
  3. 添加代码。包括添加代码到 pod 和 example project。
  4. 使 pod 公开可用。

pod lib create NAME 使用默认模版,如果想使用其他模版,可以添加 –template-url=URL 参数。

输入上面命令后,终端会询问你以下问题:

  1. What platform do you want to use?? [ iOS / macOS ],选择iOS,直接回车默认选择第一个。

  2. What language do you want to use?? [ Swift / ObjC ],选择Swift。CocoaPods会把你的库设置为framework。

  3. Would you like to include a demo application with your library? [ Yes / No ],选择Yes。如果你想要包含一个示例工程,或计划在app中测试你的库,这里需要选择Yes,以便模板文件为你的库创建Xcode工程。也就是如果你计划为pod添加截图,这里需要选择Yes。

  4. Which testing frameworks will you use? [ Quick / None ],选择Quick。提交库到CocoaPods前应当进行测试。CocoaPods推荐使用其附带的测试framework,而非Apple的XCTest。在Objective-C中,可以选择Specta/Expecta或Kiwi,其区别如下:

    • Specta/Expecta:通过不同podspecs的模块化方法。
    • Kiwi:是对Stubs/Mocks/Expections的一种一体化方法。

    CocoaPods已经在MyLib-Tests.pch文件中添加了所有必要的包含和设置,因此不必将它们包含在每个文件中。

  5. Would you like to do view based testing? [ Yes / No ],选择Yes。根据你建立的仓库,你可能会发现基于快照的测试是验证视图不同部分不同操作的最佳方法,这里建议使用FBSnapShotTestCase。如果你使用的是Specta/Expecta,那么其会包含一个pod来改进语法。

  6. What is your class prefix? 如果你选择的语言是ObjC,其最后会要求提供类前缀。

在开始下一步工作前,先查看下 pod 目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ cd ~/Desktop
$ tree PodDemo -L 2
PodDemo
├── PodDemo
│ ├── Assets # 资源文件
│ └── Classes # 类文件
├── PodDemo.podspec
├── Example # demo和测试包
│ ├── PodDemo
│ ├── PodDemo.xcodeproj
│ ├── PodDemo.xcworkspace
│ ├── Podfile # demo app的依赖文件
│ ├── Podfile.lock
│ ├── Pods
│ └── Tests
├── LICENSE # 开源协议,默认MIT License
├── README.md # markdown格式的README
└── _Pods.xcodeproj -> Example/Pods/Pods.xcodeproj #为项目提供Carthage支持的符号链接(symlink)。

10 directories, 5 files

使用pod lib create NAME命令创建pod时,会使用git进行版本管理。还会生成以下文件:

  • .travis.yml :持续集成服务Travis CI配置文件。
  • BlinkLabel.podspec :仓库的Podspec。Podspec或Spec用来描述pod库的版本信息,包括源代码网址,应当使用的文件,以及其他metadata。随着版本迭代,一个pod会有很多spec。你可以手动创建podspec,也可以使用pod spec create NAME命令创建,还可以使用pod lib create NAME命令一次创建整个目录结构。
2、验证本地 pod

在 Xcode 中打开 PodDemo.podspec 文件,可以看到 CocoaPods 已经使用模板填充了其内容。使用 pod lib lint NAME 命令可以验证 .podspec 文件是否符合规范。

在命令行输入以下命令

1
2
$ cd ~/Desktop/PodDemo
$ pod lib lint PodDemo.podspec

运行以下命令,推送本地仓库到 GitHub:

1
2
3
4
$ git add .
$ git commit -m "Initial Commit"
$ git remote add origin https://github.com/xxx/PodDemo
$ git push -u origin master:master

如果你对分布式版本控制系统git还不熟悉,可以查看教你系统学习Git一文。

到目前为止,如果操作正确,其应当通过验证:

1
2
3
4
5
$ pod lib lint PodDemo.podspec

-> PodDemo (0.1.0)

PodDemo passed validation.
3、提交 Pod 到 Specs 仓库

现在,你的本地计算机上运行了功能完备的 pod,你还可以将其提交到公开的 Specs 仓库,以便他人使用。

Specs 是托管在 GitHub 上的公共仓库,其索引了所有公开 pod。你的源代码并不一定要托管在 GitHub。例如,将源代码托管在码云。

提交 pod 到 Specs 仓库步骤如下:

    1. 为最近一次提交添加标签。
1
2
3
4
5
6
7
8
> $ git tag -a 0.1.0 -m "version 0.1.0"
> $ git push origin 0.1.0
> Counting objects: 1, done.
> Writing objects: 100% (1/1), 161 bytes | 161.00 KiB/s, done.
> Total 1 (delta 0), reused 0 (delta 0)
> To https://github.com/pro648/BlinkLabel
> * [new tag] 0.1.0 -> 0.1.0
>
    1. 使用 pod spec lint NAME 命令验证源代码与 .podspec 文件配置是否正确。
1
2
3
4
5
6
7
$ pod spec lint PodDemo.podspec

-> PodDemo (0.1.0)

Analyzed 1 podspec.

PodDemo.podspec passed validation.

进行以上操作前,要确保对 PodDemo 的本地更改已添加到 git,并推送到了远程仓库。

pod lib lint NAME 命令与 pod spec lint NAME 区别如下:

  • pod lib lint NAME:只在本地 lint 你的 pod,确保用于创建pod配置信息正确,但其不足以验证pod,只有 pod spec lint NAME 可以验证 pod。
  • pod spec lint NAME:会在本地和远程验证 pod。如代码托管在 GitHub,其会进行 lint。如果 pod spec lint NAME 没有返回错误,就可以推送 pod 到 CocoaPods。
  • 3.使用 pod trunk push NAME 命令提交 spec 到 Specs 仓库。
1
$ pod trunk push PodDemo.podspec

如果这是你第一次提交 spec 到 Specs 仓库,其会出现以下提示:

1
[!] You need to register a session first.

这时可以通过以下命令注册账号:

1
$ pod trunk register YOU_EMAIL@example.com 'NAME' --description='macbook'

Trunk 会向你的邮箱发送邮件,你必须点击邮件中的链接进行验证。

如果你在 .podspec 文件中添加了不应出现的内容,如密码、身份信息。可以使用 pod trunk delete NAME VERSION 删除指定版本pod,一般不应删除其他用户依赖的版本,删除后的版本将无法再次添加到 Specs。如果你只是学习如何添加 pod 到 CocoaPods,或确定没有用户使用你的 pod,可以使用 pod trunk deprecate NAME 命令将pod标记为不推荐使用,这样其他用户将无法搜索到你的 pod。更多相关内容,可以查看 CocoaPods 的 Pull Request FAQ #12199

四、 使用私有pod

除了将 pod 推送到 Specs,还可以创建私有 pod,便于项目管理。

1
$ pod repo push YourSpecs PodDemo.podspec

使用私有 pod 时,其 Podfile 文件如下:

1
2
3
pod 'PodDemo', :path => '~/Desktop/PodDemo/'
# 或者
pod 'PodDemo', :podspec => 'https://github.com/xxx/PodDemo/PodDemo.podspec'

如果使用了多个私有pod,可以修改Podfile文件pod source如下:

1
2
3
# 使用默认 source 时,可以不写 Specs source。如果指定了私有.podspec,则必须写明所有 source,否则,将查找不到其他开源pod。
source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/xxx/YourSpecs.git'

总结

创建 pod 供他人使用会非常有趣,也是回馈开源社区的好方法。这篇文章向你展示了哪些类型代码适合创建 pod,如何创建 pod,如何将 pod 添加到 Specs 以便其他用户可以使用。另外,你还可以查看 Quality Indexes,了解哪些因素会影响 pod 的质量指标。

参考资料:

  1. Creating Your First CocoaPod
  2. Making a CocoaPod
  3. What’s the difference between ‘pod spec lint’ and ‘pod lib lint’?
  4. ‘pod spec lint’ fails with Swift 4